package 算法.leetcode.offer;

import java.util.Arrays;

/**
 * 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[1,2,3,6,9,8,7,4,5]
 * 示例 2：
 *
 * 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 * 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 *
 * @author lchenglong
 * @date 2022/3/19
 */
public class Offer29 {

    public static void main(String[] args) {
        int[][] matrix = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        Offer29 instance = new Offer29();
        int[] ans = instance.spiralOrder(matrix);
        System.out.println(Arrays.toString(ans));
    }
    public int[] spiralOrder(int[][] matrix) {
        // 边界条件
        if (matrix == null || matrix.length == 0||matrix[0].length==0)return new int[0];
        // 二维数组的长度
        int row = matrix.length,column = matrix[0].length,len = row * column;
        int[] ans = new int[len];
        int index = 0;
        // 左边界
        int l = 0;
        // 右边界
        int r = column -1;
        // 上边界
        int t = 0;
        // 下边界
        int b = row-1;
        while (index<len){
            for (int i = l;i<=r;i++) {
                ans[index++] = matrix[t][i];
            }
            // 上边界+1
            if(++t>b)break;
            for (int i = t;i<=b;i++){
                ans[index++] = matrix[i][r];
            }
            // 右边界-1
            if(--r<l)break;
            for (int i = r;i>=l;i--){
                ans[index++] = matrix[b][i];
            }
            // 下边界-1
            if(--b<t)break;
            for (int i = b;i>=t;i--){
                ans[index++] = matrix[i][l];
            }
            // 左边界+1
            if (++l>r)break;
        }
        return ans;
    }
}
